package com.qikecn.uploadfilebybase64.server;

import it.sauronsoftware.base64.Base64;

import java.awt.Color;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.json.JSONArray;
import org.json.JSONObject;

import com.qikecn.uploadfilebybase64.MarkImageUtils;
import com.qikecn.uploadfilebybase64.RandomUtils;

public class ServerUpload {
	
	/**
	 * 水印文字的颜色
	 */
	public static Color color = Color.white;
	/**
	 * 水印文字
	 */
	//public static String markText = "";//水印文本
	/**
	 * 水印文字旋转角度，为null表示不旋转
	 */
	public static Integer degree = null;
	/**
	 * 透明度
	 */
	public static float alpha = 0.6f;
	/**
	 * 水印文字大小
	 */
	public static int fontSize = 16;
	/**
	 * 字体名称，宋体等
	 */
	public static String fontName = "宋体";
	/**
	 * 水印文字位置 0中心，1top，2bottom
	 */
	public static int location = 1;
	
	
	/**
	 * 处理客户端上传数据
	 * @param strTempFileDir
	 * @param markText 水印文本,为空时不启用
	 * @param array json数组，上传文件base64数据 返回jsonarray结果，直接返回给客户端
	 * @return
	 */
	public static String handleClientUpload(String strTempFileDir, String markText, String array){
		JSONArray resultArray = new JSONArray();
		try {
			JSONArray jsonArray = new JSONArray(array);
			for(int i=0;i<jsonArray.length();i++){
				JSONObject jsonObject = jsonArray.getJSONObject(i);
				JSONObject resultObject = new JSONObject();
				String localFilePath = jsonObject.has("localFilePath")?jsonObject.getString("localFilePath"):"";
				String base64Data = jsonObject.has("base64Data")?jsonObject.getString("base64Data"):"";
				if(!isPathLegal(localFilePath)){
					resultObject.put("ret", 400);
					resultObject.put("msg", "禁止上传的文件格式");
					resultObject.put("localFilePath", localFilePath);
				}if(base64Data == null || base64Data.equals("")){
					resultObject.put("ret", 402);
					resultObject.put("msg", "上传文件数据不能为空");
					resultObject.put("localFilePath", localFilePath);
				}else {
					String suffix = localFilePath.substring(localFilePath.lastIndexOf('.') + 1);//获取后缀
					base64Data = base64Data.replaceAll(" ", "+");//解决json传输base64字符串时，＋号转为空格致使base64解码失败，原因未知
					String tempFileName = base64DataToFile(strTempFileDir, base64Data, suffix, markText);
					if(tempFileName == null || tempFileName.equals("")){
						resultObject.put("ret", 401);
						resultObject.put("msg", "上传文件保存失败");
						resultObject.put("localFilePath", localFilePath);
					}else {
						resultObject.put("ret", 200);
						resultObject.put("msg", "上传成功");
						resultObject.put("localFilePath", localFilePath);
						resultObject.put("remoteFileName", tempFileName);
					}
				}
				resultArray.put(resultObject);
			}
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println("handleClientUpload Exception:"+e.getClass().getName());
			e.printStackTrace();
		}
		return resultArray.toString();
	}
	
	/**
	 * 将base64数据解析为文件
	 * @param strTempFileDir
	 * @param base64Data
	 * @param suffix
	 * @param markText 水印文本
	 * @return
	 */
	public static String base64DataToFile(String strTempFileDir, String base64Data, String suffix, String markText){
		String tempFileName = "";
		FileOutputStream out = null;
		try {
			File tempFileDir = new File(strTempFileDir);
			if(!tempFileDir.getParentFile().exists()){
				tempFileDir.mkdirs();
			}else if(!tempFileDir.exists()){
				tempFileDir.mkdir();
			}
			SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
			String filename = "tmp_" + sdf.format(new Date()) + RandomUtils.getRandomLetters(6);
			String filenameFull = filename + "." + suffix;
			byte[] bytes = Base64.decode(base64Data.getBytes("UTF-8"));
			
			if(isPic(filenameFull) && markText != null && !markText.equals("")) {//有水印
				MarkImageUtils.markImageBySingleText(bytes, strTempFileDir, filename, suffix, color, markText, degree, alpha, fontSize, fontName, location);
			}else {
				//out = new FileOutputStream(strTempFileDir + "/" + filename);
				out = new FileOutputStream(strTempFileDir + filenameFull);
				out.write(bytes);
			}
			tempFileName = filenameFull;
			System.out.println("base64DataToFile filename:"+filenameFull);
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println("base64DataToFile Exception:"+e.getClass().getName());
			e.printStackTrace();
		}finally{
			try {
				if(out != null)
					out.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return tempFileName;
	}
	
	/**
	 * 判断文件路径是否合法，文件类型是否为允许上传的类型
	 * 可以上传的文件类型：jpg,jpeg,gif,png,zip,war,doc,docx,ppt,pptx,xls,xlsx等
	 * @param path
	 * @return
	 */
	private static boolean isPathLegal(String path){
		if(path == null || path.equals("")){
			return false;
		}
		if(path.indexOf('.') < 0){
			return false;
		}
		
		if(isPic(path)) {
			return true;
		}
		if(path.toLowerCase().trim().endsWith(".zip") || path.toLowerCase().trim().endsWith(".rar") || path.toLowerCase().trim().endsWith(".7z")
				|| path.toLowerCase().trim().endsWith(".doc") || path.toLowerCase().trim().endsWith(".docx") || path.toLowerCase().trim().endsWith(".ppt")
				|| path.toLowerCase().trim().endsWith(".pptx") || path.toLowerCase().trim().endsWith(".xls") || path.toLowerCase().trim().endsWith(".xlsx")){
			return true;
		}else {
			return false;
		}
		
	}
	
	/**
	 * 判断是否图片
	 * @param path
	 * @return
	 */
	private static boolean isPic(String path) {
		if( path.toLowerCase().trim().endsWith(".jpg") || path.toLowerCase().trim().endsWith(".jpeg") || path.toLowerCase().trim().endsWith(".gif")
				|| path.toLowerCase().trim().endsWith(".png") ){
			return true;
		}else {
			return false;
		}
	}
}
